Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Loading in data version 1.127.0

The rescaled vectors (on the right) are what go into Legendre approximation. In this case, these plots should look identical, because all the draws from the feasible set have the same number of individuals as the Portal vector. I have at other times compared SADs without the total abundance constraint, where the rescaled plots could look quite different.
Loading required package: polynom

The green line marks the centroid, and the red line marks the Portal estimation values.
Here we are reconstructing the scaled SAD from the approximated coefficients. The hollow points are estimates from approximation with 8 polynomials, and the stars mark the true values. Using 8 polynomials for a 10-species vector gives us extremely low SSQE. There is no real value for the centroid, but closest_fs is the element of the feasible set with the lowest euclidean distance between its coefficients and the centroid coefficients.









There seems to be some relationship to skewness - skewness locates you in a particular part of the state space. Not sure what that means.
Skewness is not equivalent to centroid distance.
LS0tCnRpdGxlOiAiTWFwcGluZyBGUyBzcGFjZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc2NhZHMpCmxpYnJhcnkoZ2dwbG90MikKZGF0YXNldCA8LSAicGxhbnRzIgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQpgYGAKCmBgYHtyIGdldCBhbiBTQUR9CmlmKGRhdGFzZXQgPT0gInBsYW50cyIpIHsKICAKICBwb3J0YWxfc2FkIDwtIHBvcnRhbHI6OnBsYW50X2FidW5kYW5jZShsZXZlbCA9ICJUcmVhdG1lbnQiLCB0eXBlID0gIldpbnRlciBBbm51YWxzIiwgcGxvdHMgPSAiQWxsIiwgdW5rbm93bnMgPSBGLCBjb3JyZWN0X3NwID0gVCwgc2hhcGUgPSAiZmxhdCIsIG1pbl9xdWFkcyA9IDE2KSAlPiUKICAgIGZpbHRlcih0cmVhdG1lbnQgPT0gImNvbnRyb2wiKSAlPiUKICAgIHNlbGVjdCh5ZWFyLCBzcGVjaWVzLCBhYnVuZGFuY2UpICU+JQogICAgZmlsdGVyKHllYXIgPT0gMTk5NCkgJT4lCiAgICBzZWxlY3QoLXllYXIpICU+JQogICAgcmVuYW1lKGFidW5kID0gYWJ1bmRhbmNlKSAlPiUKICAgIHNlbGVjdChhYnVuZCkgJT4lCiAgICBhcnJhbmdlKGFidW5kKSAlPiUKICAgIGFzLm1hdHJpeCgpICU+JQogICAgYXMudmVjdG9yKCkKICAKICBubGVnIDwtIDEwCiAgCn0gZWxzZSBpZihkYXRhc2V0ID09ICJyb2RlbnRzOTQiKSB7CiAgcG9ydGFsX2RhdGEgPC0gaXNkczo6Z2V0X3RveV9wb3J0YWxfZGF0YShkb3dubG9hZD1ULCB5ZWFycyA9IGMoMTk5NCkpCiAgCiAgcG9ydGFsX3NhZCA8LSBwb3J0YWxfZGF0YSAlPiUKICAgIHNlbGVjdChzcGVjaWVzKSAlPiUKICAgIGdyb3VwX2J5KHNwZWNpZXMpICU+JQogICAgc3VtbWFyaXplKGFidW5kID0gbigpKSAlPiUKICAgIHVuZ3JvdXAoKSAlPiUKICAgIHNlbGVjdChhYnVuZCkgJT4lCiAgICBhcnJhbmdlKGFidW5kKSAlPiUKICAgIGFzLm1hdHJpeCgpICU+JQogICAgYXMudmVjdG9yKCkKICAKICBubGVnIDwtIDUKICAKfSBlbHNlIHsKICBwb3J0YWxfZGF0YSA8LSBpc2RzOjpnZXRfdG95X3BvcnRhbF9kYXRhKGRvd25sb2FkPVQsIHllYXJzID0gYygxOTkwOjE5OTUpKQogIAogIHBvcnRhbF9zYWQgPC0gcG9ydGFsX2RhdGEgJT4lCiAgICBzZWxlY3Qoc3BlY2llcykgJT4lCiAgICBncm91cF9ieShzcGVjaWVzKSAlPiUKICAgIHN1bW1hcml6ZShhYnVuZCA9IG4oKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBzZWxlY3QoYWJ1bmQpICU+JQogICAgYXJyYW5nZShhYnVuZCkgJT4lCiAgICBhcy5tYXRyaXgoKSAlPiUKICAgIGFzLnZlY3RvcigpCiAgCiAgbmxlZyA8LSA4Cn0KCm5zcHAgPSBsZW5ndGgocG9ydGFsX3NhZCkKbmluZCA9IHN1bShwb3J0YWxfc2FkKQoKcG9ydGFsX3NhZCA8LSBkYXRhLmZyYW1lKAogIGFidW5kID0gcG9ydGFsX3NhZCwKICBzb3VyY2UgPSAiZW1wIiwKICByYW5rID0gMTpsZW5ndGgocG9ydGFsX3NhZCkKKQoKYGBgCgpgYGB7ciBnZXQgYSBCVU5DSCBvZiBmcyBzYW1wbGVzLCBldmFsID0gRiwgaW5jbHVkZT1UfQoKZnNfYmFuayA8LSBzYW1wbGVfZmVhc2libGVzZXQocyA9IG5zcHAsIG4gPSBuaW5kLCBuc2FtcGxlcyA9IDEwMDAwLCBkaXN0aW5jdCA9IFRSVUUpCnNhdmUoZnNfYmFuaywgZmlsZSA9ICJmc19iYW5rXzk0LlJkcyIpCgpgYGAKCmBgYHtyIGxvYWQgZnMgYmFua30KCmlmKGRhdGFzZXQgPT0gInBsYW50cyIpIHsKICBsb2FkKGhlcmU6OmhlcmUoImZzX2JhbmtfcGxhbnRzLlJkcyIpKQp9IGVsc2UgaWYoZGF0YXNldCA9PSAicm9kZW50czk0IikgewogIGxvYWQoaGVyZTo6aGVyZSgiZnNfYmFua185NC5SZHMiKSkKfSBlbHNlIGlmKGRhdGFzZXQgPT0gInNtYWxsIikgewogIGxvYWQoaGVyZTo6aGVyZSgiZnNfYmFua19zbWFsbC5SZHMiKSkKfSBlbHNlIHsKICBsb2FkKGhlcmU6OmhlcmUoImZzX2JhbmsuUmRzIikpCn0KCmBgYAoKYGBge3IgbWFuaXAgZnNfYmFua30KZnNfYmFua19NIDwtIGZzX2JhbmsgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIG11dGF0ZShyYW5rID0gcm93X251bWJlcigpKSAlPiUKICB0aWR5cjo6Z2F0aGVyKC1yYW5rLCBrZXkgPSAic2ltIiwgdmFsdWUgPSAiYWJ1bmQiKSAlPiUKICBtdXRhdGUoc2ltID0gYXMuaW50ZWdlcihzdWJzdHIoc2ltLCAyLCBuY2hhcihzaW0pKSkpCgpgYGAKCmBgYHtyIGRlbnNpdHkgcGxvdCBwZXJoYXBzfQpmc19kcCA8LSBnZ3Bsb3QoZGF0YSA9IGZzX2JhbmtfTSwgYWVzKHggPWFzLmZhY3RvcihyYW5rKSwgeSA9IGFidW5kKSkgKyAKICBnZW9tX3BvaW50KGFscGhhID0gLjIsIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBwb3J0YWxfc2FkLCBhZXMoeCA9IHJhbmssIHkgPSBhYnVuZCksIGFscGhhID0gLjUsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJBYnVuZGFuY2U6IGRyYXdzIGZyb20gRlMgdnMgUG9ydGFsIikKCmZzX2JhbmtfTSA8LSBmc19iYW5rX00gJT4lCiAgbXV0YXRlKHNhYnVuZCA9IGFidW5kIC8gbmluZCkKCnBvcnRhbF9zYWQgPC0gcG9ydGFsX3NhZCAlPiUKICBtdXRhdGUoc2FidW5kID0gYWJ1bmQvbmluZCkKCmZzX3NkcCA8LSBnZ3Bsb3QoZGF0YSA9IGZzX2JhbmtfTSwgYWVzKHggPWFzLmZhY3RvcihyYW5rKSwgeSA9IHNhYnVuZCkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IC4yLCBzaXplID0gMSkgKwogIGdlb21fbGluZShkYXRhID0gcG9ydGFsX3NhZCwgYWVzKHggPSByYW5rLCB5ID0gc2FidW5kKSwgYWxwaGEgPSAuNSwgY29sb3IgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkFidW5kYW5jZTogZHJhd3MgZnJvbSBGUyB2cyBQb3J0YWwsIHJlc2NhbGVkIikKCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGdyb2JzID0gbGlzdChmc19kcCwgZnNfc2RwKSwgbnJvdyA9IDEpIApgYGAKCgpUaGUgcmVzY2FsZWQgdmVjdG9ycyAob24gdGhlIHJpZ2h0KSBhcmUgd2hhdCBnbyBpbnRvIExlZ2VuZHJlIGFwcHJveGltYXRpb24uIEluIHRoaXMgY2FzZSwgdGhlc2UgcGxvdHMgc2hvdWxkIGxvb2sgaWRlbnRpY2FsLCBiZWNhdXNlIGFsbCB0aGUgZHJhd3MgZnJvbSB0aGUgZmVhc2libGUgc2V0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGFzIHRoZSBQb3J0YWwgdmVjdG9yLiBJIGhhdmUgYXQgb3RoZXIgdGltZXMgY29tcGFyZWQgU0FEcyB3aXRob3V0IHRoZSB0b3RhbCBhYnVuZGFuY2UgY29uc3RyYWludCwgd2hlcmUgdGhlIHJlc2NhbGVkIHBsb3RzIGNvdWxkIGxvb2sgcXVpdGUgZGlmZmVyZW50LgoKYGBge3IgZ2V0IGFuZCBwbG90IGxlZyBhcHByb3hpbWF0aW9ufQoKZnNfbGVnX2NvZWZmcyA8LSBhcHBseShhcy5tYXRyaXgoMTpuY29sKGZzX2JhbmspKSwgTUFSR0lOID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgRlVOID0gZnVuY3Rpb24oc2ltX2luZGV4LCBmc19iYW5rX00pIAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxlZ2VuZHJlX2FwcHJveChmaWx0ZXIoZnNfYmFua19NLCBzaW0gPT0gc2ltX2luZGV4KSRzYWJ1bmQsIG5sZWcgPSBubGVnKSRjb2VmZmljaWVudHMpLCBmc19iYW5rX00gPSBmc19iYW5rX00pCgpmc19sZWdfY29lZmZzX00gPC0gZnNfbGVnX2NvZWZmcyAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgbXV0YXRlKGNvZWZmX25hbWUgPSByb3cubmFtZXMoZnNfbGVnX2NvZWZmcykpICU+JQogIHRpZHlyOjpnYXRoZXIoLWNvZWZmX25hbWUsIGtleSA9ICJzaW0iLCB2YWx1ZSA9ICJjb2VmZl92YWx1ZSIpICU+JQogIG11dGF0ZShzaW0gPSBhcy5pbnRlZ2VyKHN1YnN0cihzaW0sIDIsIG5jaGFyKHNpbSkpKSkKCnBvcnRhbF9sZWdfY29lZmZzIDwtZGF0YS5mcmFtZShjb2VmZl92YWx1ZSA9IGxlZ2VuZHJlX2FwcHJveChwb3J0YWxfc2FkJHNhYnVuZCwgbmxlZyA9IG5sZWcpJGNvZWZmaWNpZW50cykgJT4lCiAgbXV0YXRlKGNvZWZmX25hbWUgPSBuYW1lcyhsZWdlbmRyZV9hcHByb3gocG9ydGFsX3NhZCRzYWJ1bmQsIG5sZWcgPSBubGVnKSRjb2VmZmljaWVudHMpLAogICAgICAgICBjb2VmZl9pbmRleCA9IHJvd19udW1iZXIoKSkKCmNvZWZmc19wbG90IDwtIGdncGxvdChkYXRhID0gZnNfbGVnX2NvZWZmc19NLCBhZXMoeCA9IGNvZWZmX25hbWUsIHkgPSBjb2VmZl92YWx1ZSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjIsIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBwb3J0YWxfbGVnX2NvZWZmcywgYWVzKHggPSBjb2VmZl9pbmRleCwgeSA9IGNvZWZmX3ZhbHVlKSwgYWxwaGEgPSAuNSwgY29sb3IgPSAicmVkIikgKwogIHRoZW1lX2J3KCkKCmBgYAoKYGBge3IgZGlzdGFuY2UgdG8gY2VudHJvaWR9Cgpmc19jZW50cm9pZCA8LSBmc19sZWdfY29lZmZzX00gJT4lCiAgZ3JvdXBfYnkoY29lZmZfbmFtZSkgJT4lCiAgc3VtbWFyaXplKGNlbnRyb2lkX3ZhbHVlID0gbWVhbihjb2VmZl92YWx1ZSkpICU+JQogIHVuZ3JvdXAoKQoKZnNfbGVnX2NvZWZmc19NIDwtIGZzX2xlZ19jb2VmZnNfTSAlPiUKICBsZWZ0X2pvaW4oZnNfY2VudHJvaWQsIGJ5ID0gImNvZWZmX25hbWUiKQoKcG9ydGFsX2xlZ19jb2VmZnMgPC0gcG9ydGFsX2xlZ19jb2VmZnMgJT4lCiAgbGVmdF9qb2luKGZzX2NlbnRyb2lkLCBieSA9ICJjb2VmZl9uYW1lIikKCmNvZWZmc19jX3Bsb3QgPC0gY29lZmZzX3Bsb3QgKyAKICBnZW9tX2xpbmUoZGF0YSA9IHBvcnRhbF9sZWdfY29lZmZzLCBhZXMoeCA9IGNvZWZmX2luZGV4LCB5ID0gY2VudHJvaWRfdmFsdWUpLCBjb2xvciA9ICJncmVlbiIpIApjb2VmZnNfY19wbG90CmBgYAoKVGhlIGdyZWVuIGxpbmUgbWFya3MgdGhlIGNlbnRyb2lkLCBhbmQgdGhlIHJlZCBsaW5lIG1hcmtzIHRoZSBQb3J0YWwgZXN0aW1hdGlvbiB2YWx1ZXMuIAoKYGBge3IgZ2VuZXJhdGUgZnJvbSBjZW50cm9pZCwgZW1waXJpY2FsfQpmc19kaXN0IDwtIGZzX2xlZ19jb2VmZnNfTSAlPiUKICBncm91cF9ieShzaW0pICU+JQogIHN1bW1hcml6ZShjZW50cm9pZF9kaXN0ID0gZXVjbF9yb3dzKGNvZWZmX3ZhbHVlLCBjZW50cm9pZF92YWx1ZSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGNlbnRyb2lkX2Rpc3QpICU+JQogIG11dGF0ZShzaW1fcmFuayA9IHJvd19udW1iZXIoKSkKCmVzdGltYXRlc19kZiA8LSBkYXRhLmZyYW1lKAogIHJhbmsgPSBjKDE6bnNwcCksCiAgY2VudHJvaWQgPSBsZWdlbmRyZV9nZW5lcmF0ZShjb2VmZl92YWx1ZXMgPSBwb3J0YWxfbGVnX2NvZWZmcyRjZW50cm9pZF92YWx1ZSwgbmxlZyA9IG5sZWcsIG5zcHAgPSBuc3BwKSwKICBjbG9zZXN0X2ZzID0gbGVnZW5kcmVfZ2VuZXJhdGUoY29lZmZfdmFsdWVzID0gZmlsdGVyKGZzX2xlZ19jb2VmZnNfTSwgc2ltID09IGZpbHRlcihmc19kaXN0LCBzaW1fcmFuayA9PSAxKSRzaW0pJGNvZWZmX3ZhbHVlLCBubGVnID0gbmxlZywgbnNwcCA9IG5zcHApLAogIGZhcnRoZXN0X2ZzID0gbGVnZW5kcmVfZ2VuZXJhdGUoY29lZmZfdmFsdWVzID0gZmlsdGVyKGZzX2xlZ19jb2VmZnNfTSwgc2ltID09IGZpbHRlcihmc19kaXN0LCBzaW1fcmFuayA9PSBtYXgoZnNfZGlzdCRzaW1fcmFuaykpJHNpbSkkY29lZmZfdmFsdWUsIG5sZWcgPSBubGVnLCBuc3BwID0gbnNwcCksCiAgcG9ydGFsID0gbGVnZW5kcmVfZ2VuZXJhdGUoY29lZmZfdmFsdWVzID0gcG9ydGFsX2xlZ19jb2VmZnMkY29lZmZfdmFsdWUsIG5sZWcgPSBubGVnLCBuc3BwID0gbnNwcCkpICU+JQogIHRpZHlyOjpnYXRoZXIoLXJhbmssIGtleSA9ICJzb3VyY2UiLCB2YWx1ZSA9ICJlc3RfYWJ1bmQiKQoKdHJ1ZV9zYWRzIDwtIGZpbHRlcihmc19iYW5rX00sIHNpbSAlaW4lIGMoZmlsdGVyKGZzX2Rpc3QsIHNpbV9yYW5rID09IDEpJHNpbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihmc19kaXN0LCBzaW1fcmFuayA9PSBtYXgoZnNfZGlzdCRzaW1fcmFuaykpJHNpbSkpICU+JQogIGxlZnRfam9pbihzZWxlY3QoZnNfZGlzdCwgc2ltX3JhbmssIHNpbSksIGJ5ID0gInNpbSIpICU+JQogIG11dGF0ZShzb3VyY2UgPSBpZmVsc2UoKHNpbV9yYW5rID09IDEpLCAiY2xvc2VzdF9mcyIsICJmYXJ0aGVzdF9mcyIpKSAlPiUKICBzZWxlY3QoLXNpbSwgLXNpbV9yYW5rKSAlPiUKICBiaW5kX3Jvd3MobXV0YXRlKHBvcnRhbF9zYWQsIHNvdXJjZSA9ICJwb3J0YWwiKSkgJT4lCiAgbGVmdF9qb2luKGVzdGltYXRlc19kZiwgYnkgPSBjKCJyYW5rIiwgInNvdXJjZSIpKSAlPiUKICBiaW5kX3Jvd3MoZGF0YS5mcmFtZShzb3VyY2UgPSAiY2VudHJvaWQiLCBzdHJpbmdzQXNGYWN0b3JzID0gRikpCgoKc3NxZXMgPC0gZGF0YS5mcmFtZSgKICBzb3VyY2UgPSBjKCJjZW50cm9pZCIsICJjbG9zZXN0X2ZzIiwgImZhcnRoZXN0X2ZzIiwgInBvcnRhbCIpLAogIHNzcWUgPSBjKE5BLAogICAgICAgICAgIHNzcWUoZmlsdGVyKHRydWVfc2Fkcywgc291cmNlID09ICJjbG9zZXN0X2ZzIikkZXN0X2FidW5kLCBmaWx0ZXIodHJ1ZV9zYWRzLCBzb3VyY2UgPT0gImNsb3Nlc3RfZnMiKSRzYWJ1bmQpLCAKICAgICAgICAgICBzc3FlKGZpbHRlcih0cnVlX3NhZHMsIHNvdXJjZSA9PSAiZmFydGhlc3RfZnMiKSRlc3RfYWJ1bmQsIGZpbHRlcih0cnVlX3NhZHMsIHNvdXJjZSA9PSAiZmFydGhlc3RfZnMiKSRzYWJ1bmQpLAogICAgICAgICAgIHNzcWUoZmlsdGVyKHRydWVfc2Fkcywgc291cmNlID09ICJwb3J0YWwiKSRlc3RfYWJ1bmQsIGZpbHRlcih0cnVlX3NhZHMsIHNvdXJjZSA9PSAicG9ydGFsIikkc2FidW5kKSkKKQoKZXN0aW1hdGVzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBlc3RpbWF0ZXNfZGYsIGFlcyh4ID0gcmFuaywgeSA9IGVzdF9hYnVuZCwgY29sb3IgPSBzb3VyY2UpKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDEpICsKICBnZW9tX3BvaW50KGRhdGEgPSB0cnVlX3NhZHMsIGFlcyh4ID0gcmFuaywgeSA9IHNhYnVuZCwgY29sb3IgPSBzb3VyY2UpLCBzaGFwZSA9IDgpICsKICBnZW9tX2xhYmVsKGRhdGEgPSBzc3FlcywgYWVzKHggPSAyLCB5ID0gYyguOTUsIC44NywgLjgsIC43MyksIGxhYmVsID0gcGFzdGUwKCJzc3FlOiAiLCBmb3JtYXQoc2lnbmlmKHNzcWUsIDIpLCBzY2llbnRpZmljID0gRkFMU0UpKSwgY29sb3IgPSBzb3VyY2UpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChlbmQgPSAuOCwgb3B0aW9uID0gIkMiKSArCiAgdGhlbWVfYncoKSArCiAgeWxpbSgwLCAxKQoKZXN0aW1hdGVzX3Bsb3QKYGBgCgpIZXJlIHdlIGFyZSByZWNvbnN0cnVjdGluZyB0aGUgc2NhbGVkIFNBRCBmcm9tIHRoZSBhcHByb3hpbWF0ZWQgY29lZmZpY2llbnRzLiBUaGUgaG9sbG93IHBvaW50cyBhcmUgZXN0aW1hdGVzIGZyb20gYXBwcm94aW1hdGlvbiB3aXRoIDggcG9seW5vbWlhbHMsIGFuZCB0aGUgc3RhcnMgbWFyayB0aGUgdHJ1ZSB2YWx1ZXMuIFVzaW5nIDggcG9seW5vbWlhbHMgZm9yIGEgMTAtc3BlY2llcyB2ZWN0b3IgZ2l2ZXMgdXMgZXh0cmVtZWx5IGxvdyBTU1FFLiBUaGVyZSBpcyBubyByZWFsIHZhbHVlIGZvciB0aGUgY2VudHJvaWQsIGJ1dCBgY2xvc2VzdF9mc2AgaXMgdGhlIGVsZW1lbnQgb2YgdGhlIGZlYXNpYmxlIHNldCB3aXRoIHRoZSBsb3dlc3QgZXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gaXRzIGNvZWZmaWNpZW50cyBhbmQgdGhlIGNlbnRyb2lkIGNvZWZmaWNpZW50cy4gCgpgYGB7ciBkaXN0IHRvIGNlbnRyb2lkIHBsb3R9CmFsbF9kaXN0IDwtIGZzX2Rpc3QgJT4lCiAgbXV0YXRlKHNvdXJjZTEgPSAiZnMiKSAlPiUKICBtdXRhdGUoc291cmNlID0gTkEpICU+JQogIG11dGF0ZShzb3VyY2UgPSBpZmVsc2UoY2VudHJvaWRfZGlzdCA9PSBtYXgoZnNfZGlzdCRjZW50cm9pZF9kaXN0KSwgImZhcnRoZXN0X2ZzIiwgc291cmNlKSkgJT4lCiAgbXV0YXRlKHNvdXJjZSA9IGlmZWxzZShjZW50cm9pZF9kaXN0ID09IG1pbihmc19kaXN0JGNlbnRyb2lkX2Rpc3QpLCAiY2xvc2VzdF9mcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlKSkgJT4lCiAgYmluZF9yb3dzKGRhdGEuZnJhbWUoCiAgICBzb3VyY2UgPSAicG9ydGFsIiwKICAgIHNvdXJjZTEgPSAicG9ydGFsIiwKICAgIHNpbSA9IE5BLAogICAgc2ltX3JhbmsgPSBOQSwKICAgIGNlbnRyb2lkX2Rpc3QgPSBldWNsX3Jvd3MocG9ydGFsX2xlZ19jb2VmZnMkY29lZmZfdmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0YWxfbGVnX2NvZWZmcyRjZW50cm9pZF92YWx1ZSksCiAgICBzdHJpbmdzQXNGYWN0b3JzID0gRgogICkpCgpjZW50cm9pZF9kaXN0X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIoYWxsX2Rpc3QsIHNvdXJjZTEgIT0gInBvcnRhbCIpLCBhZXMoeCA9IDAsIHkgPSBjZW50cm9pZF9kaXN0KSkgKwogIGdlb21fdmlvbGluKCkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuMSwgc2l6ZSA9IC41KSArCiAgZ2VvbV9wb2ludChkYXRhID0gZmlsdGVyKGFsbF9kaXN0LCAhaXMubmEoc291cmNlKSksIGFlcyh4ID0gMCwgeSA9IGNlbnRyb2lkX2Rpc3QsIGNvbG9yID0gc291cmNlKSwgc2l6ZSA9IDIpICsKICB0aGVtZV9idygpKwogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QoYmVnaW4gPSAuMiwgZW5kID0gLjgsIG9wdGlvbiA9ICJDIikKCmNlbnRyb2lkX2Rpc3RfcGxvdAoKYGBgCgoKCgpgYGB7ciBoZWF0bWFwLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aCA9IDE4fQoKZnNfYmFua19NIDwtIGxlZnRfam9pbihmc19iYW5rX00sIHNlbGVjdChmc19kaXN0LCBzaW0sIGNlbnRyb2lkX2Rpc3QpLCBieSA9ICJzaW0iKQoKZGlzdF9xdWFudGlsZXMgPC0gcXVhbnRpbGUoZnNfYmFua19NJGNlbnRyb2lkX2Rpc3QsIHByb2JzID0gYygwLCAuNzUsIC44NSwgLjk1LCAuOTc1LCAuOTksIDEpKQoKZnNfYmFua19NIDwtIGZzX2JhbmtfTSAlPiUKICBtdXRhdGUocWJpbiA9IHZhcHBseShhcy5tYXRyaXgoZnNfYmFua19NJGNlbnRyb2lkX2Rpc3QpLCAKICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBmdW5jdGlvbihjX2QsIGRfcSkgCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oKGFzLmludGVnZXIoc3Vic3RyKG5hbWVzKGRfcSlbbWF4KHdoaWNoKGRfcSA8PSBjX2QpKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKG5hbWVzKGRfcSlbbWF4KHdoaWNoKGRfcSA8PSBjX2QpKV0pIC0gMSkpKSAvIDEwMCksCiAgICAgICAgICAgICAgICAgICAgICAgZF9xID0gZGlzdF9xdWFudGlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRlVOLlZBTFVFID0gLjEpKQoKZnNfaGVhdG1hcCA8LSBnZ3Bsb3QoZGF0YSA9IGZzX2JhbmtfTSwgYWVzKHggPSBhcy5mYWN0b3IocWJpbiksIHkgPSBzYWJ1bmQsIGNvbG9yID0gcWJpbikpICsKICBnZW9tX3BvaW50KHNpemUgPSAuNSwgYWxwaGEgPSAuMSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGZpbHRlcihmc19iYW5rX00sIHFiaW4gPiAuOTUpLCBzaXplID0gMSwgYWxwaGEgPSAxKSArIAogIHNjYWxlX2NvbG91cl92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IC44KSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBwYW5lbC5zcGFjaW5nLnggPSB1bml0KDAsImxpbmUiKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocmFuayksIHN3aXRjaCA9ICJ4IikKZnNfaGVhdG1hcAoKYGBgCgpgYGB7ciBsaW5lY2xvdWR9Cgpmc19iYW5rX2xpbmVjbG91ZCA8LSBmc19iYW5rX00gJT4lCiAgc2VsZWN0KHNpbSwgY2VudHJvaWRfZGlzdCkgJT4lCiAgZGlzdGluY3QoKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNlbnRyb2lkX2Rpc3QpKSAlPiUKICBtdXRhdGUoZGlzdF9yYW5rID0gcm93X251bWJlcigpKSAlPiUKICByaWdodF9qb2luKGZzX2JhbmtfTSwgYnkgPWMoInNpbSIsICJjZW50cm9pZF9kaXN0IikpICU+JQogIG11dGF0ZShxYmluX2FscGhhID0gaWZlbHNlKHFiaW4gPD0gLjc1LCAuNzUsIHFiaW4pKQoKbGluZWNsb3VkIDwtIGdncGxvdChkYXRhID0gZnNfYmFua19saW5lY2xvdWQsIGFlcyh4ID0gcmFuaywgeSA9IHNhYnVuZCwgY29sb3IgPSBhcy5mYWN0b3IocWJpbiksIGFscGhhID0gcWJpbl9hbHBoYSwgZ3JvdXAgPSBzaW0pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fbGluZShkYXRhID0gZmlsdGVyKGZzX2JhbmtfbGluZWNsb3VkLCBkaXN0X3JhbmsgPD0gMyksIGFlcyh4ID0gcmFuaywgeSA9IHNhYnVuZCwgY29sb3IgPSBhcy5mYWN0b3IocWJpbikpLCBhbHBoYSA9IDEsIHNpemUgPSAuNikgKwogIHNjYWxlX2NvbG91cl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IC44KSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKbGluZWNsb3VkCgpgYGAKCmBgYHtyIGNvZWZmaWNpZW50cyBsaW5lY2xvdWR9Cgpmc19jb2VmZnNfY2xvdWQgPC0gbGVmdF9qb2luKGZzX2xlZ19jb2VmZnNfTSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3Qoc2VsZWN0KGZzX2JhbmtfbGluZWNsb3VkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltLCBxYmluLCBxYmluX2FscGhhLCBkaXN0X3JhbmspKSwgYnkgPSAic2ltIikgJT4lCiAgbGVmdF9qb2luKHNlbGVjdChwb3J0YWxfbGVnX2NvZWZmcywgY29lZmZfbmFtZSwgY29lZmZfaW5kZXgpLCAgYnkgID0gImNvZWZmX25hbWUiKQoKZnNfY29lZmZzX2xpbmVjbG91ZCA8LSAgZ2dwbG90KGRhdGEgPSBmc19jb2VmZnNfY2xvdWQsIGFlcyh4ID0gY29lZmZfaW5kZXgsIHkgPSBjb2VmZl92YWx1ZSwgY29sb3IgPSBhcy5mYWN0b3IocWJpbiksIGFscGhhID0gcWJpbl9hbHBoYSwgZ3JvdXAgPSBzaW0pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fbGluZShkYXRhID0gZmlsdGVyKGZzX2NvZWZmc19jbG91ZCwgZGlzdF9yYW5rIDw9IDMpLCBhZXMoeCA9IGNvZWZmX2luZGV4LCB5ID0gY29lZmZfdmFsdWUsIGNvbG9yID0gYXMuZmFjdG9yKHFiaW4pKSwgYWxwaGEgPSAxLCBzaXplID0gLjYpICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiLCBlbmQgPSAuOCkgKyAKICB0aGVtZV9idygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gdW5pcXVlKGZzX2NvZWZmc19jbG91ZCRjb2VmZl9pbmRleCksIGxhYmVscyA9IHVuaXF1ZShmc19jb2VmZnNfY2xvdWQkY29lZmZfbmFtZSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCmZzX2NvZWZmc19saW5lY2xvdWQKCmBgYAoKYGBge3IgYWRkIHNvbWUgcmF0c30KCmVtcF9saW5lY2xvdWQgPC0gbGluZWNsb3VkICsKICBnZW9tX3BvaW50KGRhdGEgPSBtdXRhdGUocG9ydGFsX3NhZCwgc2ltID0gMSwgcWJpbiA9IDAsIHFiaW5fYWxwaGEgPSAxKSwgYWVzKHggPSByYW5rLCB5ID0gc2FidW5kKSwgY29sb3IgPSAiI0ZGMDAwMCIsIHNob3cubGVnZW5kID0gRikKCmVtcF9saW5lY2xvdWQKCmVtcF9jb2VmZl9saW5lY2xvdWQgPC0gZnNfY29lZmZzX2xpbmVjbG91ZCArCiAgZ2VvbV9wb2ludChkYXRhID0gbXV0YXRlKHBvcnRhbF9sZWdfY29lZmZzLCBzaW0gPSAxLCBxYmluID0gMCwgcWJpbl9hbHBoYSA9IDEpLAogICAgICAgICAgICAgYWVzKHggPWNvZWZmX2luZGV4LCB5PSBjb2VmZl92YWx1ZSksICBjb2xvciA9ICIjRkYwMDAwIiwgc2hvdy5sZWdlbmQgPSBGKQoKZW1wX2NvZWZmX2xpbmVjbG91ZAoKYGBgCgpgYGB7ciByYXcgYWJ1bmRhbmNlIGNlbnRyb2lkfQoKcmF3X2FidW5kX2NlbnRyb2lkIDwtIGZzX2JhbmtfTSAlPiUKICBzZWxlY3QocmFuaywgc2ltLCBzYWJ1bmQpICU+JQogIGdyb3VwX2J5KHJhbmspICU+JQogIHN1bW1hcml6ZShhYnVuZCA9IG1lYW4oc2FidW5kKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShzb3VyY2UgPSAicmF3X2FidW5kX2NlbnRyb2lkIikgJT4lCiAgYmluZF9yb3dzKHJlbmFtZShlc3RpbWF0ZXNfZGYsIGFidW5kID0gZXN0X2FidW5kKSkKCgpyYXdfY2VudHJvaWQgPC0gZ2dwbG90KGRhdGEgPSByYXdfYWJ1bmRfY2VudHJvaWQsIGFlcyh4ID0gcmFuaywgeSA9IGFidW5kLCBjb2xvciA9IHNvdXJjZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInZpcmlkaXMiKQoKcmF3X2NlbnRyb2lkCmBgYAoKYGBge3Igb2JzIHByZWQgcGxvdHMsIGZpZy5oZWlnaHQgPSA4LCBmaWcud2lkdGggPSA0fQoKZnNfcmF3X2Rpc3QgPC0gZnNfYmFua19NICU+JQogIHNlbGVjdChyYW5rLCBzaW0sIHNhYnVuZCkgJT4lCiAgZ3JvdXBfYnkoc2ltKSAlPiUKICBzdW1tYXJpemUocmF3ZGlzdCA9IGV1Y2xfcm93cyhzYWJ1bmQsIGZpbHRlcihyYXdfYWJ1bmRfY2VudHJvaWQsIHNvdXJjZSA9PSAicmF3X2FidW5kX2NlbnRyb2lkIikkYWJ1bmQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShyYXdkaXN0KSAlPiUKICBtdXRhdGUocmF3X3NpbV9yYW5rID0gcm93X251bWJlcigpKSAlPiUKICBsZWZ0X2pvaW4oZnNfZGlzdCwgYnkgPSAic2ltIikKCgpyYXdfY29lZmZfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZzX3Jhd19kaXN0LCBhZXMoeCA9IHJhd2Rpc3QsIHkgPSBjZW50cm9pZF9kaXN0KSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBkYXRhLmZyYW1lKHggPSBzZXEobWluKGMoZnNfcmF3X2Rpc3QkcmF3ZGlzdCwgZnNfcmF3X2Rpc3QkY2VudHJvaWRfZGlzdCkpLCBtYXgoYyhmc19yYXdfZGlzdCRyYXdkaXN0LCBmc19yYXdfZGlzdCRjZW50cm9pZF9kaXN0KSksIGxlbmd0aC5vdXQgPSAxMCkpLCBhZXMoeCA9IHgsIHkgPSB4KSwgY29sb3IgPSAib3JhbmdlIikgKwogIHRoZW1lX2J3KCkKCnJhd19jb2VmZl9yYW5rX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmc19yYXdfZGlzdCwgYWVzKHggPSByYXdfc2ltX3JhbmssIHkgPSBzaW1fcmFuaykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZShkYXRhID0gZGF0YS5mcmFtZSh4ID0gc2VxKG1pbihjKGZzX3Jhd19kaXN0JHJhd19zaW1fcmFuaywgZnNfcmF3X2Rpc3Qkc2ltX3JhbmspKSwgbWF4KGMoZnNfcmF3X2Rpc3QkcmF3X3NpbV9yYW5rLCBmc19yYXdfZGlzdCRzaW1fcmFuaykpLCBsZW5ndGgub3V0ID0gMTApKSwgYWVzKHggPSB4LCB5ID0geCksIGNvbG9yID0gIm9yYW5nZSIpICsKICB0aGVtZV9idygpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShncm9icyA9IGxpc3QocmF3X2NvZWZmX3Bsb3QsIHJhd19jb2VmZl9yYW5rX3Bsb3QpKQoKCmBgYAoKYGBge3IgZXZhcn0KCmZzX2JhbmtfbWV0cyA8LSBmc19iYW5rX00gJT4lCiAgZ3JvdXBfYnkoc2ltKSAlPiUKICBtdXRhdGUoZXZhciA9IGNvbmRpdGlvbmFsc2Fkczo6ZXZhcihzYWJ1bmQpLAogICAgICAgICBza2V3ID0gIGNvbmRpdGlvbmFsc2Fkczo6cmFkX3NrZXcoc2FidW5kKSkgJT4lCiAgdW5ncm91cCgpCgoKZXZhcl9wbG90IDwtIGdncGxvdChkYXRhID0gZnNfYmFua19tZXRzLCBhZXMoeCA9IHJhbmssIHkgPSBzYWJ1bmQsIGNvbG9yID0gZXZhciwgZ3JvdXAgPSBzaW0pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuMSwgYWxwaGEgPSAuMikgKwogIGdlb21fbGluZShkYXRhID0gZmlsdGVyKGZzX2JhbmtfbWV0cywgZXZhciA8PSBxdWFudGlsZShmc19iYW5rX21ldHMkZXZhciwgcHJvYnMgPSAuMDAxKVsxXSksIGFscGhhID0gLjUsIHNpemUgPSAuNSkgKwogIHNjYWxlX2NvbG91cl92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IC44KSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKZXZhcl9wbG90CgoKc2tld19wbG90IDwtIGdncGxvdChkYXRhID0gZnNfYmFua19tZXRzLCBhZXMoeCA9IHJhbmssIHkgPSBzYWJ1bmQsIGNvbG9yID0gc2tldywgZ3JvdXAgPSBzaW0pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAuMSwgYWxwaGEgPSAuMikgKwogIGdlb21fbGluZShkYXRhID0gZmlsdGVyKGZzX2JhbmtfbWV0cywgc2tldyA8PSBxdWFudGlsZShmc19iYW5rX21ldHMkc2tldywgcHJvYnMgPSAuMDAxKVsxXSksIGFscGhhID0gLjUsIHNpemUgPSAuMykgKyAKICBnZW9tX2xpbmUoZGF0YSA9IGZpbHRlcihmc19iYW5rX21ldHMsIHNrZXcgPj0gcXVhbnRpbGUoZnNfYmFua19tZXRzJHNrZXcsIHByb2JzID0gMC45OTkpWzFdKSwgYWxwaGEgPSAuNSwgc2l6ZSA9IC4zKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIiwgZW5kID0gLjgpICsgCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBnZW9tX3BvaW50KGRhdGEgPSBtdXRhdGUocG9ydGFsX3NhZCwgc2ltID0gMSwgcWJpbiA9IDAsIHFiaW5fYWxwaGEgPSAxKSwgYWVzKHggPSByYW5rLCB5ID0gc2FidW5kKSwgY29sb3IgPSAiI0ZGMDAwMCIsIHNob3cubGVnZW5kID0gRikKCnNrZXdfcGxvdAoKY29lZmZzX3NrZXcgPC0gZnNfYmFua19tZXRzICU+JQogIHNlbGVjdChzaW0sIHNrZXcpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgcmlnaHRfam9pbihmc19sZWdfY29lZmZzX00sIGJ5ID0gInNpbSIpICU+JQogIGxlZnRfam9pbihzZWxlY3QocG9ydGFsX2xlZ19jb2VmZnMsIGNvZWZmX25hbWUsIGNvZWZmX2luZGV4KSwgYnkgPSAiY29lZmZfbmFtZSIpCgpjb2VmZnNfc2tld19wbG90IDwtIGdncGxvdChkYXRhID0gY29lZmZzX3NrZXcsIGFlcyh4ID0gY29lZmZfaW5kZXgsIHkgPSBjb2VmZl92YWx1ZSwgY29sb3IgPSBza2V3LCBncm91cCA9IHNpbSkpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAuMSwgYWxwaGEgPSAuMikgKwogIGdlb21fbGluZShkYXRhID0gZmlsdGVyKGNvZWZmc19za2V3LCBza2V3IDw9IHF1YW50aWxlKGNvZWZmc19za2V3JHNrZXcsIHByb2JzID0gLjAwMSlbMV0pLCBhbHBoYSA9IC41LCBzaXplID0gLjMpICsgCiAgZ2VvbV9saW5lKGRhdGEgPSBmaWx0ZXIoY29lZmZzX3NrZXcsIHNrZXcgPj0gcXVhbnRpbGUoY29lZmZzX3NrZXckc2tldywgcHJvYnMgPSAwLjk5OSlbMV0pLCBhbHBoYSA9IC41LCBzaXplID0gLjMpICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19jKG9wdGlvbiA9ICJwbGFzbWEiLCBlbmQgPSAuOCkgKyAKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgICsKICBnZW9tX3BvaW50KGRhdGEgPSBtdXRhdGUocG9ydGFsX2xlZ19jb2VmZnMsIHNpbSA9IDEsIHFiaW4gPSAwLCBxYmluX2FscGhhID0gMSksCiAgICAgICAgICAgICBhZXMoeCA9Y29lZmZfaW5kZXgsIHk9IGNvZWZmX3ZhbHVlKSwgIGNvbG9yID0gIiNGRjAwMDAiLCBzaG93LmxlZ2VuZCA9IEYpCgpjb2VmZnNfc2tld19wbG90CmBgYAoKVGhlcmUgc2VlbXMgdG8gYmUgc29tZSByZWxhdGlvbnNoaXAgdG8gc2tld25lc3MgLSBza2V3bmVzcyBsb2NhdGVzIHlvdSBpbiBhIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgc3RhdGUgc3BhY2UuIE5vdCBzdXJlIHdoYXQgdGhhdCBtZWFucy4gCgpgYGB7ciBjb21wYXJlIHNrZXcgdG8gZGlzdGFuY2V9CnNrZXdfZGlzdGFuY2UgPC0gY29lZmZzX3NrZXcgJT4lCiAgc2VsZWN0KHNpbSwgc2tldykgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBhcnJhbmdlKHNrZXcpICU+JQogIG11dGF0ZShza2V3X3JhbmsgPSByb3dfbnVtYmVyKCkpICU+JQogIGxlZnRfam9pbihmc19kaXN0LCBieSA9ICJzaW0iKSAlPiUKICByZW5hbWUoZGlzdF9yYW5rID0gc2ltX3JhbmspCgpza2RfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHNrZXdfZGlzdGFuY2UsIGFlcyh4ID0gc2tldywgeSA9IGNlbnRyb2lkX2Rpc3QpKSArCiAgZ2VvbV9wb2ludCgpCgpza2RfcGxvdAoKc2tkX3JhbmtfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHNrZXdfZGlzdGFuY2UsIGFlcyh4ID0gc2tld19yYW5rLCB5ID0gZGlzdF9yYW5rKSkgKyAKICBnZW9tX3BvaW50KCkKCnNrZF9yYW5rX3Bsb3QKCnNrZXdfdmlvbGluIDwtIGdncGxvdChkYXRhID0gc2tld19kaXN0YW5jZSwgYWVzKHggPSAwLCB5ID0gc2tldykpICsKICBnZW9tX3Zpb2xpbigpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gMCwgeSA9IGNvbmRpdGlvbmFsc2Fkczo6cmFkX3NrZXcocG9ydGFsX3NhZCRzYWJ1bmQpKSkKc2tld192aW9saW4KCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKGdyb2JzID0gbGlzdChza2V3X3Zpb2xpbiwgY2VudHJvaWRfZGlzdF9wbG90KSkKYGBgCgpTa2V3bmVzcyBpcyBub3QgZXF1aXZhbGVudCB0byBjZW50cm9pZCBkaXN0YW5jZS4g